home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 146_01 / ccint.txt < prev    next >
Text File  |  1985-03-09  |  24KB  |  1,328 lines

  1.  ORG 0
  2.  NAM SMALL-C INTERPRETER
  3.  OPT NOP,NOG
  4. *
  5. *   LAST UPDATE   9-SEP-82
  6. *
  7.  JMP BEGIN START THE INTERPRETER
  8.  
  9. *  AN INDIRECT CALL TABLE
  10.  NOP PUT ON A BOUNDARY OF 4
  11.  FCB 86
  12.  JMP fclose+1
  13.  FCB 86
  14.  JMP fopen+1
  15.  FCB 86
  16.  JMP getc+1
  17.  FCB 86
  18.  JMP getchar+1
  19.  FCB 86
  20.  JMP gets+1
  21.  FCB 86
  22.  JMP putc+1
  23.  FCB 86
  24.  JMP putchar+1
  25.  FCB 86
  26.  JMP puts+1
  27.  NOP
  28.  JMP RTSC
  29.  FCB 86
  30.  JMP isalpha+1
  31.  FCB 86
  32.  JMP isdigit+1
  33.  FCB 86 
  34.  JMP isalnum+1
  35.  FCB 86
  36.  JMP islower+1
  37.  FCB 86
  38.  JMP isupper+1
  39.  FCB 86
  40.  JMP isspace+1
  41.  FCB 86
  42.  JMP toupper+1
  43.  FCB 86
  44.  JMP tolower+1
  45.  FCB 86
  46.  JMP strclr+1
  47.  FCB 86
  48.  JMP strlen+1
  49.  FCB 86
  50.  JMP strcpy+1
  51.  FCB 86
  52.  JMP strcat+1
  53.  FCB 86
  54.  JMP strcmp+1
  55.  RMB 4*4 ROOM FOR 4 MORE
  56.  
  57.  LIB FLEXPTRS
  58.  
  59. NFILES EQU 4 MAX NO OF DISK FILES OPEN AT ONCE
  60. PC RMB 2 PSEUDO PROGRAM COUNTER
  61. R1A RMB 1 WORKING 16 BIT
  62. R1B RMB 1 --REGISTER
  63. DFLAG FCB NFILES-1 DIVIDE ROUTINE FLAG
  64. STEMP RMB 2 TEMP STORAGE FOR STACK POINTER
  65. X1TMP RMB 2 TEMP STORAGE FOR X REG
  66. X2TMP RMB 2 ... DITTO ...
  67. FCBPTR RMB 2 POINTER INTO FCB TABLE
  68. FCBTBL FDB FCB TABLE OF FCB POINTERS
  69.  RMB NFILES*2 ROOM FOR THE REST
  70.  
  71.  
  72.  
  73. ***************************************************
  74.  
  75. BEGIN LDX #FCBTBL+2 POINT TO FCB ADDRESSES
  76.  LDA A #NFILES-1
  77.  STA A DFLAG   INIT COUNTER
  78.  LDA A $AC2B GET TOP OF MEMORY
  79.  LDA B $AC2C
  80.  
  81. BLOOP SUB B #$40 SUBTR 320 (SIZE OF FCB)
  82.  SBC A #1
  83.  STA A 0,X SAVE FCB ADDRESS
  84.  INX
  85.  STA B 0,X
  86.  INX
  87.  DEC DFLAG DONE ???
  88.  BNE BLOOP
  89.  
  90.  CLR 0,X MARK END OF TABLE
  91.  CLR 1,X
  92.  STA A STEMP TOP OF STACK AREA
  93.  STA B STEMP+1
  94.  LDX STEMP
  95.  TXS SET STACK POINTER
  96.  
  97.  LDX #FCBTBL POINT TO TABLE OF FCB ADDRESSES
  98. Init STX FCBPTR
  99.  LDX 0,X GET FCB ADDRESS
  100.  BEQ Initend QUIT IF END OF TABLE
  101.  CLR 2,X MARK AS NOT IN USE
  102.  LDX FCBPTR
  103.  INX
  104.  INX
  105.  BRA Init
  106.  
  107. Initend LDX #$800
  108.  BRA NEXT2 START THE INTERPRETATION
  109.  
  110. **************************************************************
  111. *
  112. *  THE HEART OF THE INTERPRETER--- NEXT INSTRUCTION FETCHER.
  113. *
  114. BUMP2 LDX PC GET PROG COUNTER
  115. BUMP2A INX INCR BY 2
  116.  INX
  117.  BRA NEXT1 FETCH NEXT INSTRUCTION
  118.  
  119. NEXT LDX PC
  120. NEXT1 STA A R1A SAVE THE WORK
  121.  STA B R1B --REGISTER
  122. NEXT2 LDA B 0,X GET THE PSEUDO-INSTRUCTION
  123.   INX  (B CONTAINS A TABLE OFFSET)
  124.  STX PC SAVE NEW PC
  125.  STA B JJJ+2 SAVE AS PAGE OFFSET
  126.  LDA B R1B RESTORE
  127. JJJ LDX JTABLE POINT TO ROUTINE (SELF MODIFYING CODE)
  128.  JMP 0,X GO EXECUTE THE PSEUDO-INSTR.
  129.  
  130. **************************************************************
  131. *                  THE JUMP TABLE                            *
  132. **************************************************************
  133.  
  134.  ORG *+255/256*256  MUST START ON A PAGE BOUNDARY
  135.  
  136. JTABLE FDB LD1IM  #0
  137.  FDB LD1SOFF #1
  138.  FDB LD1 #2
  139.  FDB LDB1 #3
  140.  FDB LD1R #4
  141.  FDB LDB1R #5
  142.  FDB ST1 #6
  143.  FDB STB1 #7
  144.  FDB ST1SP #8
  145.  FDB STB1SP #9
  146.  FDB PUSHR1 #10
  147.  FDB EXG1 #11
  148.  FDB JMPL #12
  149.  FDB BRZL #13
  150.  FDB JSRL #14
  151.  FDB JSRSP #15
  152.  FDB RTSC #16
  153.  FDB MODSP #17
  154.  FDB DBL1 #18
  155.  FDB ADDS #19
  156.  FDB SUBFST #20
  157.  FDB MUL1 #21
  158.  FDB DIV1 #22
  159.  FDB MOD #23
  160.  FDB ORS #24
  161.  FDB XORS #25
  162.  FDB ANDS #26
  163.  FDB ASRS #27
  164.  FDB ASLS #28
  165.  FDB NEGR #29
  166.  FDB NOTR #30
  167.  FDB INCR #31
  168.  FDB DECR #32
  169.  FDB ZEQ #33
  170.  FDB ZNE #34
  171.  FDB ZLT #35
  172.  FDB ZLE #36
  173.  FDB ZGT #37
  174.  FDB ZGE #38
  175.  FDB ULT #39
  176.  FDB ULE #40
  177.  FDB UGT #41
  178.  FDB UGE #42
  179.  FDB ASMC #43
  180.  
  181. *************************************************************
  182. *-------------------------
  183. * #0 LOAD REG WITH IMMED. VALUE
  184. LD1IM LDX PC
  185.  LDA A 0,X HIGH BYTE
  186.  LDA B 1,X LOW BYTE
  187.  JMP BUMP2A
  188.  
  189. *-------------------------
  190. * #1 LOAD STACK ADDRESS + OFFSET INTO REG
  191. LD1SOFF STS R1A SAVE STACK VALUE
  192.  LDX PC
  193.  LDA A 0,X GET OFFSET 
  194.  LDA B 1,X -- VALUE
  195.  SEC
  196.  ADC B R1B ADD OFFSET + 1
  197.  ADC A R1A
  198.  JMP BUMP2A
  199.  
  200. *-------------------------
  201. * #2  LOAD WORD @ ADDRESS
  202. LD1 LDX PC
  203.  LDX 0,X GET ADDRESS
  204. LD1A LDA A 0,X GET WORD
  205.  LDA B 1,X
  206.  JMP BUMP2
  207.  
  208. *-------------------------
  209. * #3  LOAD BYTE @ ADDRESS
  210. LDB1 LDX PC
  211.  LDX 0,X GET ADDRESS
  212.  CLR A
  213.  LDA B 0,X GET BYTE
  214.  BPL LDB1A
  215.  COM A SIGN EXTEND
  216. LDB1A JMP BUMP2
  217.  
  218. *-------------------------
  219. * #4  LOAD WORD INDIRECT (ADDR IN REG)
  220. LD1R LDX R1A GET ADDRESS
  221.  LDA A 0,X GET WORD
  222.  LDA B 1,X
  223.  JMP NEXT
  224.  
  225. *-------------------------
  226. * #5  LOAD BYTE INDIRECT (ADDR IN REG)
  227. LDB1R LDX R1A
  228.  CLR A
  229.  LDA B 0,X GET BYTE
  230.  BPL LDB1RA
  231.  COM A
  232. LDB1RA JMP NEXT
  233.  
  234. *-------------------------
  235. * #6  STORE WORD @ ADDRESS
  236. ST1 LDX PC
  237.  LDX 0,X GET ADDRESS
  238.  STA A 0,X STORE WORD
  239.  STA B 1,X
  240.  JMP BUMP2
  241.  
  242. *-------------------------
  243. * #7  STORE BYTE @ ADDRESS
  244. STB1 LDX PC
  245.  LDX 0,X GET ADDR
  246.  STA B 0,X STORE BYTE
  247.  JMP BUMP2
  248.  
  249. *-------------------------
  250. * #8  STORE WORD @ ADDRESS ON STACK
  251. ST1SP TSX STACK TO INDEX
  252.  LDX 0,X GET ADDRESS
  253.  STA A 0,X STORE WORD
  254.  STA B 1,X
  255.  INS
  256.  INS POP STACK
  257.  JMP NEXT
  258.  
  259. *-------------------------
  260. * #9  STORE BYTE @ ADDRESS ON STACK
  261. STB1SP TSX
  262.  LDX 0,X
  263.  STA B 0,X STORE BYTE
  264.  INS POP ...
  265.  INS
  266.  JMP NEXT
  267.  
  268. *-------------------------
  269. * #10  PUSH WORD ON STACK
  270. PUSHR1 PSH B
  271.  PSH A
  272.  LDX PC
  273.  JMP NEXT2
  274.  
  275. *-------------------------
  276. * #11  SWAP REG AND TOP OF STACK
  277. EXG1 TSX
  278.  LDX 0,X GET VALUE ON STACK
  279.  STX R1A SAVE
  280.  INS
  281.  INS
  282.  PSH B
  283.  PSH A REG ON STACK
  284.  LDA A R1A NEW REG
  285.  LDA B R1B
  286.  LDX PC
  287.  JMP NEXT2
  288.  
  289. *-------------------------
  290. * #12  JUMP TO LABEL
  291. JMPL LDX PC
  292. JMP1 LDX 0,X GET ADDRESS (NEW PC)
  293.  JMP NEXT2
  294.  
  295. *-------------------------
  296. * #13  JUMP TO LABEL IF FALSE
  297. BRZL ORA A R1B SET FLAGS
  298.  BEQ JMPL IF REG=0 -- JUMP
  299.  JMP BUMP2 ELSE, PROCEED
  300.  
  301. *-------------------------
  302. * #14  CALL TO LABEL
  303. JSRL LDX PC
  304.  INX ADJUST RETURN
  305.  INX -- ADDRESS
  306.  DES
  307.  STS *+5 *** SELF MODIFYING CODE ***
  308.  DES
  309.  STX $FFFF PUSH RETURN ADDRESS
  310.  BRA JMPL
  311.  
  312. *-------------------------
  313. * #15  CALL TO TOP OF STACK
  314. JSRSP TSX POINT TO STACK
  315.  LDX 0,X GET ADDRESS (NEW PC)
  316.  INS POP
  317.  INS
  318.  LDA B PC+1 GET RETURN ADDRESS
  319.  PSH B
  320.  LDA B PC
  321.  PSH B SAVE RETURN ADDRESS
  322.  JMP NEXT2
  323.  
  324. *-------------------------
  325. * #16  RETURN TO CALLER
  326. RTSC TSX
  327.  LDX 0,X GET ADDRESS
  328.  INS POP
  329.  INS
  330.  JMP NEXT1
  331.  
  332. *-------------------------
  333. * #17  MODIFY THE STACK POINTER
  334. MODSP LDX PC
  335.  LDA A 0,X GET VALUE
  336.  LDA B 1,X
  337.  STS STEMP
  338.  ADD B STEMP+1 ADD STACK POINTER
  339.  ADC A STEMP
  340.  STA A STEMP
  341.  STA B STEMP+1
  342.  LDS STEMP NEW STACK POINTER
  343.  LDA A R1A RESTORE REGISTER
  344.  LDA B R1B
  345.  JMP BUMP2A
  346.  
  347. *---------------------------
  348. * #18  DOUBLE THE PRIMARY REGISTER
  349. DBL1 ASL B
  350.  ROL A
  351.  JMP NEXT
  352.  
  353. *---------------------------
  354. * #19  ADD REG AND TOP OF STACK (THEN POP)
  355. ADDS TSX
  356.  ADD B 1,X DO THE ADD
  357.  ADC A 0,X
  358.  JMP POPS POP & RETURN
  359.  
  360. *---------------------------
  361. * #20  SUBTRACT REG FROM TOP OF STACK
  362. SUBFST PUL A GET VALUE OFF STACK
  363.  PUL B
  364.  SUB B R1B SUBTRACT REGISTER
  365.  SBC A R1A
  366.  JMP NEXT
  367.  
  368. *---------------------------
  369. * #21  MULTIPLY TOP OF STACK BY REG (RESULT IN REG)
  370. MUL1 PSH B
  371.  PSH A REG ON STACK
  372.  LDA A #16
  373.  PSH A SET COUNTER
  374.  CLR A 
  375.  CLR B
  376.  TSX POINT TO DATA
  377.  
  378. M2 ROR 3,X SHIFT MULTIPLIER
  379.  ROR 4,X
  380.  DEC 0,X DONE ?
  381.  BMI M4
  382.  BCC M3
  383.  ADD B 2,X
  384.  ADC A 1,X
  385.  
  386. M3 ROR A
  387.  ROR B SHIFT RESULT
  388.  BRA M2 AND LOOP
  389.  
  390. M4 INS CLEAN STACK
  391.  INS
  392.  INS
  393.  PUL A GET RESULT
  394.  PUL B
  395.  JMP NEXT
  396.  
  397. *-----------------------------
  398. * #22  DIVIDE THE TOP OF STACK BY REG --- RESULT IN REG.
  399. DIV1 BSR BDIV DO THE BASIC DIVIDE
  400.  LDA A DFLAG GET SIGN FLAG
  401.  AND A #1 MASK OFF BIT ZERO
  402.  PUL A GET RESULT
  403.  PUL B
  404.  BEQ DIV1R
  405.  
  406. DIV1N BSR NEGATE NEGATE THE VALUE IN A,B
  407.  
  408. DIV1R JMP NEXT
  409.  
  410. *-----------------------------
  411. * #23  DIVIDE TOP OF STACK BY REG --- REMAINDER IN REG
  412. MOD BSR BDIV
  413.  INS CLEAN STACK
  414.  INS
  415.  PSH A TEMP SAVE
  416.  LDA A DFLAG GET SIGN FLAG
  417.  BPL MOD1
  418.  COM A
  419.  
  420. MOD1 AND A #1 MASK OFF BIT 0
  421.  PUL A
  422.  BNE DIV1N IF BIT 0 SET, NEGATE
  423.  
  424.  JMP NEXT
  425.  
  426. *****************************************************
  427. *   BASIC 16 BIT DIVIDE ROUTINE
  428. * ENTER WITH: DIVIDEND ON STACK
  429. *             DIVISOR IN A,B
  430. * EXIT WITH:  QUOTIENT ON STACK
  431. *             REMAINDER IN A,B
  432. *             SIGN FLAG IN DFLAG
  433. *
  434. BDIV CLR DFLAG
  435.  TST A CHECK DIVISOR SIGN
  436.  BPL BDIV1
  437.  
  438.  INC DFLAG ADJUST SIGN FLAG
  439.  BSR NEGATE TAKE ABSOLUTE VALUE
  440.  
  441. BDIV1 PSH B FORCE ON STACK
  442.  PSH A
  443.  LDA A #17 BIT COUNTER
  444.  PSH A
  445.  TSX POINT TO DATA
  446.  LDA A 5,X CHECK SIGN
  447.  BPL BDIV2 -- OF DIVIDEND
  448.  
  449.  COM DFLAG A